package com.aerozhonghuan.archive.mapper;

import com.aerozhonghuan.archive.entity.DataRecord;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 归档库操作 Mapper 接口
 *
 */
@Mapper
public interface ArchiveMapper {

    /**
     * 根据时间戳字段统计指定时间之前的记录数
     *
     * @param schemaName      归档库名称
     * @param tableName       表名称
     * @param timeStampColumn 时间戳字段名称
     * @param timeStamp       时间戳值，条件为：timeStampColumn <= timeStamp
     * @return 指定条件下的记录数
     */
    long countByTimeStamp(@Param("schemaName") String schemaName,
                          @Param("tableName") String tableName,
                          @Param("timeStampColumn") String timeStampColumn,
                          @Param("timeStamp") Date timeStamp);

    /**
     * 根据时间戳字段统计指定时间之前的记录数
     *
     * @param schemaName      归档库名称
     * @param tableName       表名称
     * @param timeStampColumn 时间戳字段名称
     * @param startTime       开始时间
     * @param endTime       结束时间
     * @return 指定条件下的记录数
     */
    long countByMigration(@Param("schemaName") String schemaName,
                          @Param("tableName") String tableName,
                          @Param("timeStampColumn") String timeStampColumn,
                          @Param("startTime") Date startTime,
                          @Param("endTime") Date endTime);

    /**
     * 统计指定时间范围内的记录数，条件为时间字段在 [startTime, endTime) 内。
     *
     * @param schemaName      归档库名称
     * @param tableName       归档表名称
     * @param timeStampColumn 时间字段名称
     * @param startTime       起始时间（包含）
     * @param endTime         结束时间（不包含）
     * @return 指定时间范围内的记录数
     */
    long countByTimeRange(@Param("schemaName") String schemaName,
                          @Param("tableName") String tableName,
                          @Param("timeStampColumn") String timeStampColumn,
                          @Param("startTime") Date startTime,
                          @Param("endTime") Date endTime);

    /**
     * 查询指定 id 及其后续的第一条记录
     *
     * @param schemaName 归档库名称
     * @param tableName  表名称
     * @param id         起始 id
     * @return 第一条满足条件的记录；若不存在，则返回 null
     */
    DataRecord getRecordByIdGreaterOrEqual(@Param("schemaName") String schemaName,
                                           @Param("tableName") String tableName,
                                           @Param("id") Long id);

    /**
     * 计算指定记录的 MD5 摘要，校验数据一致性
     *
     *
     * @param schemaName 归档库名称
     * @param tableName  表名称
     * @param id         记录的 id
     * @param columns    参与计算 MD5 的字段列表
     * @return 记录的 MD5 摘要字符串
     */
    String getRowMd5(@Param("schemaName") String schemaName,
                     @Param("tableName") String tableName,
                     @Param("id") Long id,
                     @Param("columns") String columns);


    /**
     * 批量插入数据记录到目标表（全量数据迁移）
     *
     * @param dataList         数据记录列表
     * @param targetDbName     目标数据库名称
     * @param targetTableName  目标表名称
     * @param columns          字段列表
     * @return 成功插入的记录数
     */
    int insertBatchGeneric(@Param("dataList") List<Object[]> dataList,
                           @Param("targetDbName") String targetDbName,
                           @Param("targetTableName") String targetTableName,
                           @Param("columns") String columns);


    /**
     * 查询满足删除条件的所有记录ID
     *
     * @param schemaName      归档库名称
     * @param tableName       表名称
     * @param timeStampColumn 时间字段名称
     * @param baseDate        基准日期
     * @return 符合条件的记录ID列表
     */
    List<Long> fetchIdsForDeletion(@Param("schemaName") String schemaName,
                                   @Param("tableName") String tableName,
                                   @Param("timeStampColumn") String timeStampColumn,
                                   @Param("baseDate") Date baseDate,
                                   @Param("deleteMonth") int deleteMonth);

    /**
     * 根据ID列表批量删除归档库中数据
     *
     * @param schemaName      归档库名称
     * @param tableName       表名称
     * @param timeStampColumn 时间字段名称
     * @param idList          待删除的记录ID列表
     * @return 删除的记录数
     */
    int deleteArchiveRecordsByIds(@Param("schemaName") String schemaName,
                                  @Param("tableName") String tableName,
                                  @Param("timeStampColumn") String timeStampColumn,
                                  @Param("idList") List<Long> idList);

    /**
     * 根据指定时间范围查询待回迁记录的ID列表
     *
     * @param targetDbName    归档库名称
     * @param targetTableName 表名称
     * @param timeStampColumn 时间字段名称
     * @param start           开始时间（包含）
     * @param end             结束时间（不包含）
     * @return 待回迁记录ID列表
     */
    List<Long> fetchIdsByTimeRange(@Param("targetDbName") String targetDbName,
                                   @Param("targetTableName") String targetTableName,
                                   @Param("timeStampColumn") String timeStampColumn,
                                   @Param("start") Date start,
                                   @Param("end") Date end);

    /**
     * 根据指定的ID列表查询完整数据记录。
     *
     * @param targetDbName    归档库名称
     * @param targetTableName 表名称
     * @param timeStampColumn 时间字段名称
     * @param idList          待查询记录的ID集合
     * @return 对应记录的列表
     */
    @MapKey("id")
    List<Map<String, Object>> fetchFullDataByIds(@Param("targetDbName") String targetDbName,
                                                 @Param("targetTableName") String targetTableName,
                                                 @Param("timeStampColumn") String timeStampColumn,
                                                 @Param("idList") List<Long> idList);
}
